昨天說 RAG 像讓 LLM 開卷考:不用死背,考試時翻資料夾找答案。但動手做才發現,開卷考有個前提——你要先翻得到那一頁。整本課本丟給你卻不知道答案在第幾章,開卷跟沒開一樣。所以今天進入 Stage 2,只做一件事:給一個問題,要能找出最相關的段落,而且能量測準不準,不是看起來會動就好。
一、素材:一份虛構的《員工請假管理規範》
企業導入 LLM 第一個撞到的牆,是模型不知道公司內部資料,所以我自己造了一份擬真語料:《員工請假管理規範》,共 12 條,涵蓋特休申請與遞延結算、病假診斷證明、補休效期、婚喪假、家庭照顧假、職務代理人、緊急事故補請、曠職處分(聲明:內容純屬虛構)。之後整個系列都用這份文件。
二、實作:三步做出最小可用的檢索
第一步,把文件依「## 第 N 條」直接切成一條一段。不過真實文件不會這麼配合,留給明天談。
第二步,用 OpenAI 的 text-embedding-3-small 這個 embedding model 把 12 條條文一次全部轉成向量。每段文字變成一個 1536 維的數值向量,語意越接近、向量距離越近,「相關不相關」從一種感覺變成可以計算的數字。
第三步,使用者的問題同樣轉成向量,跟 12 條條文逐一算餘弦相似度,排序取前三名。整個「檢索」就這樣完成。
三、這樣做一次,到底花多少錢?
text-embedding-3-small 定價是每百萬 token 0.02 美元。把整份規範(12 條)加上 10 個測試問題全部 embedding 一次,實際用量:消耗 1801 tokens,成本約 0.000036 美元 ≈ 新台幣 0.0011 元(快取命中部分不計費)。
四、小實驗:10 個問題,實測準不準
Demo 部分總共設計了 10 題,分兩組:5 個直白問法,用詞跟文件幾乎一樣,例如「婚假總共有幾天?」;5 個口語問法,故意用文件沒出現過的講法,例如「加班換的假放到過期會怎樣?」(文件寫「補休」)、「特休沒休完會怎樣?」(文件寫「遞延與結算」)。每題事先標好預期條文,判定標準是 top-1 是否命中。
| 類型 | 問題 | Top-1 條文 | 相似度 | 命中 |
|---|---|---|---|---|
| 直白 | 病假連續請幾天以上需要附診斷證明? | 第 4 條(病假) | 0.6089 | ✅ |
| 直白 | 特休假最晚要在幾天前提出申請? | 第 2 條(特休假) | 0.5947 | ✅ |
| 直白 | 婚假總共有幾天? | 第 7 條(婚假) | 0.6587 | ✅ |
| 直白 | 請假幾天以上需要指定職務代理人? | 第 10 條(請假程序與職務代理人) | 0.6984 | ✅ |
| 直白 | 事假一年最多可以請幾天? | 第 5 條(事假) | 0.5940 | ✅ |
| 口語 | 加班換的假放到過期會怎樣? | 第 6 條(補休) | 0.5880 | ✅ |
| 口語 | 特休沒休完會怎樣? | 第 2 條(特休假) | 0.5588 | ❌ |
| 口語 | 早上突然掛急診,來不及先請假怎麼辦? | 第 11 條(緊急事故之補請) | 0.5247 | ✅ |
| 口語 | 沒來上班也沒跟任何人講,會有什麼後果? | 第 11 條(緊急事故之補請) | 0.4218 | ❌ |
| 口語 | 小孩要打疫苗需要我帶去,可以請什麼假? | 第 4 條(病假) | 0.4270 | ❌ |
結果: 直白問法 5 題全中;口語問法 5 題中 2 題;總命中率 7/10。
五、沒中的那幾題,才是今天最有價值的部分
把沒命中的題目 top-3 攤開看:
問題出在使用者說的話和文件寫的字是兩種語言:文件內容和口語通常沒幾個字重疊。Embedding 雖然抓語意不抓字面,但語意距離仍會被用詞拉開——相似度分數直接反映這件事。值得注意的是,正確答案往往就在 top-2、top-3,分數差距很小,代表方向沒錯,只是被表面用詞蓋過。
我今天不解決它,這是之後 query 改寫與 rerank 的主題,先把洞挖在這裡。但如果只跑一個 happy path demo,根本不會知道這個問題存在——這就是為什麼檢索要量測,不能用感覺驗收。
小結
一句話總結:
Embedding 不是讓程式「看懂」文字,是把「相關不相關」變成可以計算的距離。而且這個距離量得出來、也量得出極限——它會被「使用者的口語」和「文件的公文體」之間的用詞落差拉開。
今天還有一個沒解決的問題:這份文件一條剛好一段,是我運氣好。真實世界的文件是 30 頁的 PDF,切太大會塞爆 context,切太小語意會碎掉。到底要怎麼切?明天 Day 9:Chunking,我會拿三種切法實測給你看。
程式連結及請假文件:
https://drive.google.com/drive/folders/13an60AFCLHaoEISJV3ZxcKUWPsFMPCay?usp=drive_link
OpenAI Embeddings 文件:
https://developers.openai.com/api/docs/models/text-embedding-3-small
定價:
https://openai.com/api/pricing/